﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;


namespace conAppTcpServer
{
    class csServer
    {
        static void Main(string[] args)
        {
            try
            {
                IPAddress ipAd = IPAddress.Parse("127.0.0.1");
                                //IPAddress.Parse("192.168.2.104"); //usar local del IP address.
                //Raul te correji esto: Tenes que usar la direccion 127.0.0.1, ya que esta direccion automaticamente te enlaza la IP actual con tu variable ipAd
                //                      Si usas "192.168.2.204" solo te va a funcionar para esa direccion IP^.. osea.. si usas DHCP que te asigna culquier direccion libre del ruter
                //                      vas perdido...                      

                /* Initializes the Listener */
                TcpListener myList = new TcpListener(ipAd, 8001);
                /* Start Listeneting at the specified port */
                myList.Start();
                Console.WriteLine("El servidor corre el puerto del 8001...");
                Console.WriteLine("El punto local es :" + myList.LocalEndpoint);
                Console.WriteLine("Esperar que se conecte.....");


                TcpClient objClient = myList.AcceptTcpClient();      
                //Socket s = myList.AcceptSocket();   //Raul: Preferimos usar TcpClient en vez de Socket directamente. Una de los metodos de TcpClient
                                                      // te devuelve el socket asociado a ese cliente en particular.

                Console.WriteLine("Conectado aceptado desde " + objClient.Client.RemoteEndPoint);
                byte[] byteArrBufferRecepcion = new byte[100];

                //Raul: Generalmente se utiliza un NetworkStream para leer datos o enviarlos. Lo que hago a continuacion es ligar el stream con el TCPClient
                NetworkStream objStream = objClient.GetStream();

                int i;
                string strDataRecibida = "";

                // Loop para recebir datos del cliente
                while ((i = objStream.Read(byteArrBufferRecepcion, 0, byteArrBufferRecepcion.Length)) != 0)
                {
                    //Aca te

                    Console.WriteLine("Recibido...");
                    /*  Raul te reemplazo el for por algo mas elegante :) ... mira el GetString de abajo
                    for (int i = 0; i < k; i++)
                        Console.Write(Convert.ToChar(b[i]));
                     */
                    strDataRecibida = System.Text.Encoding.ASCII.GetString(byteArrBufferRecepcion, 0, i);
                    Console.WriteLine(strDataRecibida);

                    ASCIIEncoding asen = new ASCIIEncoding();
                   
                    // Raul: Te reemplace el s.Send()... por el correspondiente al NetworkStream
                    objStream.Write(asen.GetBytes("Se han recibido desde el servidor ."), 0, asen.GetBytes("Se han recibido desde el servidor .").Length);

                    Console.WriteLine("\n Enviado sastifecho");
                }

                // Raul: Te reemplazo el s.Close(). en el caso de TCPCLient.. tenemos que cerrar el TCPClient de la misma forma, mira lo puse abajo
                objClient.Close();              

                myList.Stop();
            }
            catch (Exception e)
            {
                Console.WriteLine("Error..... " + e.StackTrace);
            } 
        }
    }
}
